/****************************************************
	文件：HLog.cs
	作者：HuskyT
	邮箱：1005240602@qq.com
	日期：2020/12/31 13:16:41
	功能：框架内部调用的日志打印接口（只在游戏运行时使用）
*****************************************************/

#define LOGGER_OPEN

using System;
using System.Diagnostics;
using HTFW.Core;
using HTFW.Utility.Global;
using IDisposable = HTFW.Core.IDisposable;

namespace HTFW.Logger
{
    public class HLog : IDisposable, ILogicUpdate
    {
        static ILog mLog = null;
        static IPersistentLog mPersistentLog = null;
        static bool mHasInit = false; //是否已初始化
        static bool mNeedPackageMsg; //包装信息
        static bool mNeedPersistent; //日志可持久化（存储到本地）

        public HLog()
        {
            LogFactory factory = new LogFactory();
            mLog = factory.CreateLog();
            mPersistentLog = factory.CreatePersistentLog();

            mHasInit = true;
            mNeedPackageMsg = false;
            mNeedPersistent = false;

            Refresh();
        }

        public void Dispose()
        {
            mLog.Dispose();
            mPersistentLog.Dispose();

            mHasInit = false;
            mNeedPackageMsg = false;
            mNeedPersistent = false;
        }

        /// <summary>
        /// 日志打印 设置
        /// </summary>
        /// <param name="needPackageMsg">是否需要包装信息</param>
        /// <param name="needPersistent">是否需要持久化信息到本地</param>
        public void Setting(bool needPackageMsg, bool needPersistent)
        {
            mNeedPackageMsg = needPackageMsg;
            mNeedPersistent = needPersistent;

            Refresh();
        }

        void Refresh()
        {
            mPersistentLog.Open = mNeedPersistent;
        }

        public void OnLogicUpdate()
        {
            if (mPersistentLog.IsNotNull())
                mPersistentLog.OnLogicUpdate();
        }

        //------------------------------  对外开放的日志打印方法  ------------------------------//

        #region 对外开放的日志打印方法

        public static void Info(string msg)
        {
            LogMsg(msg, Channel.Info, mNeedPackageMsg);
        }

        public static void Info(string msg, params object[] args)
        {
            LogMsg(string.Format(msg, args), Channel.Info, mNeedPackageMsg);
        }

        public static void Todo(string msg)
        {
            LogMsg(msg, Channel.Todo, mNeedPackageMsg);
        }

        public static void Todo(string msg, params object[] args)
        {
            LogMsg(string.Format(msg, args), Channel.Todo, mNeedPackageMsg);
        }

        public static void Debug(string msg)
        {
            LogMsg(msg, Channel.Debug, mNeedPackageMsg);
        }

        public static void Debug(string msg, params object[] args)
        {
            LogMsg(string.Format(msg, args), Channel.Debug, mNeedPackageMsg);
        }

        public static void Warning(string msg)
        {
            LogMsg(msg, Channel.Warning, mNeedPackageMsg);
        }

        public static void Warning(string msg, params object[] args)
        {
            LogMsg(string.Format(msg, args), Channel.Warning, mNeedPackageMsg);
        }

        public static void Error(string msg)
        {
            LogMsg(msg, Channel.Error, mNeedPackageMsg);
        }

        public static void Error(string msg, params object[] args)
        {
            LogMsg(string.Format(msg, args), Channel.Error, mNeedPackageMsg);
        }

        #endregion


        //------------------------------  Private Function  ------------------------------//
        [Conditional("LOGGER_OPEN")]
        private static void LogMsg(string msg, Channel channel, bool needPackageMsg)
        {
            if (!mHasInit) return;

            switch (channel)
            {
                case Channel.Default:
                    break;
                case Channel.Info:
                    mLog.Info(needPackageMsg ? PackageMsg(msg, channel) : msg);
                    break;
                case Channel.Todo:
                    mLog.Todo(needPackageMsg ? PackageMsg(msg, channel) : msg);
                    break;
                case Channel.Debug:
                    mLog.Debug(needPackageMsg ? PackageMsg(msg, channel) : msg);
                    break;
                case Channel.Warning:
                    mLog.Warning(needPackageMsg ? PackageMsg(msg, channel) : msg);
                    break;
                case Channel.Error:
                    mLog.Error(needPackageMsg ? PackageMsg(msg, channel) : msg);
                    break;
            }
        }

        /// <summary>
        /// 包装信息
        /// </summary>
        /// <param name="msg">信息</param>
        /// <param name="channel">频道</param>
        /// <returns></returns>
        private static string PackageMsg(string msg, Channel channel)
        {
            return string.Format("({0})--[{1}]：{2}", DateTime.Now.ToString(), channel, msg);
        }


        /// <summary>
        /// 日志消息频道
        /// </summary>
        public enum Channel
        {
            Default = 0,

            //打印信息（程序正常运行的信息）
            Info,

            //待完成的信息
            Todo,

            //debug时输出的信息
            Debug,

            //警告信息
            Warning,

            //错误信息
            Error,
        }
    }
}
